package controllers.log;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import common.DateUtil;
import common.StringUtils;
import model.ChannelCondition;
import play.Play;
import play.mvc.Controller;

/**
 * 日志
 *
 *
 * @version 1.0
 * @since JDK1.7
 * @author yutao
 * @company 上海朝阳永续信息技术有限公司
 * @copyright (c) 2016 SunTime Co'Ltd Inc.All rights reserved.
 * @date 2017年6月6日下午3:26:26
 */
public class LogAction extends Controller {

	private static Logger logger = LogManager.getLogger(LogAction.class);
	
	/**
	 * 获取日志列表
	 * @param condition
	 * @author yutao
	 * @throws IOException 
	 * @date 2017年6月6日下午3:27:23
	 */
	public static void getLogList(ChannelCondition condition) throws IOException{
		List<?> pageList = commonPageList(condition);
		
		renderJSON(pageList);
	}

	/**
	 * 因为这段代码其他地方也用到抽成公共方法
	 * @param condition
	 * @return
	 * @author yutao
	 * @date 2017年6月8日上午11:08:56
	 */
	public static List<?> commonPageList(ChannelCondition condition) {
		List<Map<String, String>> lhm = getLog(condition);
		//分页处理
		Integer page = condition.getPage();
		Integer rows = condition.getRows();
		List<?> pageList = pageList(lhm, page, rows);
		return pageList;
	}
	
	/**
	 * 数组分页
	 * @param listMap
	 * @param page
	 * @param rows
	 * @return
	 * @author yutao
	 * @date 2017年6月8日上午9:51:47
	 */
	public static List<?> pageList(List<?> listMap, Integer page, Integer rows) {
		if(listMap == null || listMap.size() == 0){
			return null;
		}
		List<Object> lm = new ArrayList<Object>();
		int length = listMap.size();
		if(length <= rows){
			return listMap;
		}else if(page*rows>=length){
			lm.addAll(listMap.subList((page-1)*rows, length));
		}else if(page*rows < length){
			lm.addAll(listMap.subList((page-1)*rows, rows));
		}
		return lm;
	}

	/**
	 * 得到该项目中的所有构建日志并排序（降序）
	 * @param condition
	 * @return
	 * @author yutao
	 * @date 2017年6月8日上午9:55:50
	 */
	public static List<Map<String, String>> getLog(ChannelCondition condition){

		String projectName = condition.getProjectName();
//		List<String> serverip = condition.getServerip();
		
		//进入到相关目录拿到所有的log文件，进行排序分页
		String homeDir = Play.configuration.getProperty("autodeploy.home");//项目的主目录
		String buildPath = homeDir + File.separator + "jobs" + File.separator + projectName + File.separator + "builds" + File.separator;
		
		File buildFile = new File(buildPath);
		if(!buildFile.exists()){
			return null;
		}
		
		File[] listFiles = buildFile.listFiles(new FilenameFilter() {
			@Override
			public boolean accept(File dir, String name) {
				
				if(StringUtils.isNumeric(name)){
					return true;
				}
				return false;
			}
		});
		
		if(listFiles.length == 0){
			return null;
		}
		List<File> fileList = new ArrayList<File>();
		
		for(File f : listFiles){
			fileList.add(f);
		}
		
		Collections.sort(fileList, new Comparator<File>() {
			@Override
			public int compare(File f1, File f2) {
				if(f1.lastModified() > f2.lastModified()){
					return -1;
				}else if (f1.lastModified() < f2.lastModified()){
					return 1;
				}
				return 0;
			}
		});
		
		List<Map<String, String>> listLhm = new ArrayList<Map<String, String>>(); 
		for(File fi : fileList){
			LinkedHashMap<String, String> lhm = new LinkedHashMap<String, String>();
			lhm.put(fi.getName(), DateUtil.dateToString(new Date(fi.lastModified()), "yyyy-MM-dd HH:mm"));
			listLhm.add(lhm);
		}
		return listLhm;
	}
	
	/**
	 * 查看数据日志详情
	 * 
	 * @author yutao
	 * @date 2017年6月8日上午11:23:09
	 */
	public static void progresshtml(ChannelCondition condition){
		String projectName = condition.getProjectName();//项目名
		Integer logId = condition.getLogId();//日志文件名
		
		String str = commonProgress(projectName, logId);
		render(str, projectName, logId);
	}

	/**
	 * 获取日志信息实际方法
	 * @param projectName
	 * @param logId
	 * @return 
	 * @author yutao
	 * @date 2017年6月9日下午5:50:02
	 */
	public static String commonProgress(String projectName, Integer logId) {
		String homeDir = Play.configuration.getProperty("autodeploy.home");//项目的主目录
		String buildPath = homeDir + File.separator + "jobs" + File.separator + projectName + File.separator + "builds" + File.separator;
		
		String logPath = buildPath + logId;
		
		File file = new File(logPath);
		String str = "";
		try {
			BufferedReader br = new BufferedReader(new FileReader(file));
//			String msg = null;
			int read = -1;
			char[] cbuff = new char[1024];
			while((read = br.read(cbuff, 0, cbuff.length)) != -1){//之所以不使用readLine是因为把原有的\r\n给去掉了，而这里是需要的
				str += new String(cbuff, 0 ,read);
			}
			br.close();
		} catch (IOException e) {
			logger.debug("-----progresshtml----" + e.getStackTrace());
		}
		return str;
	}
	
	/**
	 * 
	 * @param condition
	 * @return
	 * @author yutao
	 * @date 2017年6月9日下午6:12:48
	 */
	public static void getProgressInfo(ChannelCondition condition){
		String projectName = condition.getProjectName();//项目名
		Integer logId = condition.getLogId();//日志文件名
		String str = commonProgress(projectName, logId);
		boolean flag = false;
		if(str.contains("Finished:")){
			flag = true;
		}
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("flag", flag);
		map.put("result", str);
		renderJSON(map);
	}
}
